/*
 * 进制之间的转换
 */


/**
 * 将参数传入的十进制整数转换为二进制形式
 * @param decimal 即将被转换十进制整数(暂时只考虑非负数)
 */
function dicimalToBinary(decimal){
    // 声明一个变量用来记录转换后得到的二进制形式
    let s = '' ;
    // 重新声明一个变量用来控制循环是否继续
    let n = decimal ;
    while( n > 0 ){
        let y = n % 2 ; 
        s = y + s ; // 将每次求得的余数连接到字符串最前面
        n = Math.trunc( n / 2 ) ; // 求商取整
    }
    // 将得到的二进制形式返回
    return s ;
}

let bin = dicimalToBinary( 25 );
console.log( bin );

/**
 * 将以二进制形式表示的整数转换为十进制整数
 * @param binary 以二进制形式表示的整数
 */
function binaryToDecimal(binary) {
    // 首先检查 binary 是否是个字符串
    if( typeof binary != 'string' ) {
        let e = new Error( '参数不是字符串哦' );
        throw e ;
    }

    let sum = 0 ;
    let index = binary.length - 1 ; // 取字符串中最后一个字符的索引
    let n = 0 ;
    while( index >= 0 ){
        let ch = binary.charAt(index); // 取得指定索引处的单个字符
        let r = ch * ( 2 ** n );
        sum = sum + r ;
        index-- ;
        n++ ;
    }

    return sum ;
}

let dec = binaryToDecimal( '10011001' );
console.log( dec );

/**
 * 将十进制整数转换为十六进制形式的字符串
 * @param decimal 即将被转换的整数
 * @returns 返回转换后的十六进制形式字符串
 */
function decimalToHex(decimal){
    if( typeof decimal != 'number'){
        let x = new Error('参数不是数字哦');
        throw x ;
    }

    // 创建一个数组，在数组中依次存储十六个计数符号
    const SIGNS = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];

    let s = '' ;
    let n = decimal;
    while( n > 0 ){
        let i = n % 16 ; // 除以16取余数
        let c = SIGNS[ i ] ; // 将求得的余数当作数组下标来使用
        s = c + s ; // 已经连接好的余数放后面，新出来的余数放前面
        n = Math.trunc( n / 16 ); // 除以16求商取整
    }

    return s ;
}

let hex = decimalToHex(100);
console.log( hex );


/**
 * 将十六进制形式表示的整数转换为十进制整数
 * @param hex 需要转换的十六进制形式字符串
 * @returns 返回转换后的十进制整数
 */
function hexToDecimal(hex){
    let dec = 0 ;
    // 参照 binaryToDecimal 完成
    return dec ;
}
